package cn.easytogo.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletContext;
import org.junit.Test;

/**
 * 文件处理的工具类
 * */
public class FileUtil {
	/**
	 * 文件保存方法，在指定目录下自动生成当天日期的文件夹
	 * @param context 系统全局上下文(如果不是web工程，直接用null代替)
	 * @param path 文件相对路径，不以“/”开头(如果不是web工程要输入文件准确位置)
	 * @param file 要保存的文件
	 * @param fileName 文件名称
	 * @param needNewFolder 是否需要自动新建以当天日期命名的文件夹
	 * 
	 * @return String 文件保存后的名称
	 * @throws IOException 
	 * */
	public static String saveFile(ServletContext context,String path, File file,String fileName,boolean needNewFolder,String rq) throws IOException{
		String realpath = path;
		if(context!=null){//如果为web工程则需获取真实位置
			realpath = context.getRealPath(path);
		}
		String datefolder = "";
		if(needNewFolder){
			Date rq4folder = DateUtil.getDate();
			if(rq!=null&&!"".equals(rq)){
				rq4folder = DateUtil.parse(rq);
			}
			datefolder = new SimpleDateFormat("yyyyMMdd").format(rq4folder);
			//datefolder = DateUtil.format(DateUtil.getDate(),"yyyyMMdd");
		}
		File folder = new File(realpath + "\\"+datefolder);//在指定目录下自动生成当天日期的文件夹
		if(!folder.exists()){
			folder.mkdir();
		}
		fileName=exist(realpath + "\\"+datefolder,fileName,true);
		uploadFile(realpath + "\\"+datefolder, file, fileName);//文件保存至指定位置
		return path+"/"+(needNewFolder ? datefolder+"/":"")+fileName;
	}
	/**
	 * 判断同名文件是否存在并处理的方法
	 * @param path 文件路径
	 * @param fileName 文件名称
	 * @param needRename 是否需要对已经存在同名的文件进行重命名，true重命名，false覆盖已存在文件
	 * 
	 * @return String 文件处理后的名称
	 * */
	public static  String exist(String path,String fileName,boolean needRename){//利用迭代，反复查询是否重复
		String filepath = path+"\\"+fileName;//如果同名文件存在了，在其后加以标号
		String end = fileName.substring(fileName.indexOf("."));//后缀
		int no = 1;
		if(needRename&&new File(filepath).exists()){
			String m1 = fileName.substring(0, fileName.indexOf("."));
			if(m1.lastIndexOf("_")>=0){
				try{
					no = Integer.parseInt(m1.substring(m1.lastIndexOf("_")+1));
					no++;
					fileName = m1.substring(0, m1.lastIndexOf("_"))+"_"+no+end;
				}catch(Exception e){
					//e.printStackTrace();
					//no=1;
					fileName=m1+"_"+no+end;
				}
			}else{
				fileName = m1+"_"+no+end;
			}
			return exist(path,fileName,true);
		}else{
			return fileName;
		}
	}
	
	/**
	 * 保存文件到磁盘
	 * @param confPath 磁盘绝对路径（要上传到的路径）
	 * @param file
	 * @param fileName(含扩展名)
	 * @throws IOException 异常抛出，用户使用过程中处理
	 */
	public static void uploadFile(String confPath, File file, String fileName)
			throws IOException {
		File folder = new File(confPath + "\\" + fileName);
		folder.createNewFile();
		FileOutputStream fout = new FileOutputStream(folder);
		FileInputStream fin = new FileInputStream(file);
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = fin.read(buffer)) > 0) {
			fout.write(buffer, 0, len);
		}
		fout.flush();
		fin.close();
		fout.close();
	}
	@Test
	public void testSave() throws Exception {
		File f = new File("D:\\TDDOWNLOAD\\androidSoft\\1_A.txt");
		System.out.println(f.getName()+"---"+f.exists());
		saveFile(null, "D:\\TDDOWNLOAD\\android\\", f, f.getName(), false,null);
	}
}
